﻿//////////////////////////////////////////////////////////////////////////////
//
//  Copyright © 1998-2024 Glodon Company Limited.  All rights reserved.
//
//  Use of this software is subject to the terms of the Glodon license
//  agreement provided at the time of installation or download, or which
//  otherwise accompanies this software in either electronic or hard copy form.  
//
//////////////////////////////////////////////////////////////////////////////


#pragma once

#include "GcmpModel.h"
#include "NdbDataSchema.h"

namespace gcmp 
{ 
    class IFamilyTypeInfo;
    class UniIdentity;

    /// \brief 当加载族的时候， 族文档如果已经存在了的处理的方式
    SERIALIZABLE_ENUM_CLASS(FamilyFoundStrategy)
    {
        FF_Create = 0,      ///< 作为新的族加载进来， 族名字会重新生成
        FF_Overwrite = 1    ///< 会覆盖已有的族
    };

    /// \brief 当加载族的时候，有重名族的情况下用户的操作选项
    enum class LoadOptions : int32_t
    {
        Overwrite = 0,      ///< 覆盖
        Delete = 1,         ///< 删除
        Cancel = 2,         ///< 取消状态（一般是被用户关闭或取消）
        Reserve = 3         ///< 保留
    };

    /// \brief 加载族的时候的一些可配置的选项
    class GCMP_MODEL_EXPORT IFamilyLoadOptions
    {
    public:
        /// \brief 当一个类别没有的时候， 询问使用哪一种类别替换,支持取消
        ///
        /// 当加载一个族， 如果这个族已经存在并且用覆盖的方式加载时， 如果一个类型在新的族中不存在， 就会回调这个函数， 询问使用哪一种类别替换
        /// \param familyTypeName 没有的类别的名字
        /// \param instanceCount 这个类别都有多少个实例
        /// \param familyTypeInfo 可供替换的类别
        /// \param uniIdentity 拿到替换的类别的Id
        /// \return 返回加载构件时的选项
        virtual LoadOptions AskReplaceTypeOption(const std::wstring& familyTypeName, int instanceCount, const std::vector<const gcmp::IFamilyTypeInfo*>& familyTypeInfo, UniIdentity& uniIdentity) const = 0;

        /// \brief 当载入一个族时， 如果这个族已经存在了， 询问加载的方式
        ///
        /// \return 返回加载的方式， 新建或覆盖
        virtual FamilyFoundStrategy OnFamilyFound() const = 0;

        GCMP_OBSOLETE_API(2021/11/01, IFamilyLoadOptions::AskReplaceTypeOption(const std::wstring&, int, const std::vector<const gcmp::IFamilyTypeInfo*>&, UniIdentity&) const)
            virtual UniIdentity AskReplaceTypeOption(const std::wstring& familyTypeName, int instanceCount, const std::vector<const gcmp::IFamilyTypeInfo*>& familyTypeInfo) const = 0;
    };
}// namespace gcmp

